package com.calvin.study.observer.subject.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import com.calvin.study.observer.observer.IObserver;
import com.calvin.study.observer.subject.ISubject;

/**
 * 被观察者，维护依赖的对象，发布通知。
 */
@Component
public class ConcreteSubject implements ISubject, InitializingBean {

	@Autowired private ApplicationContext applicationContext;
	
	//观察者的容器
	private  List<IObserver> observerList = new ArrayList<>();
	

	@Override
	public void register(IObserver observer) {
		observerList.add(observer);
	}

	@Override
	public void remove(IObserver observer) {
		observerList.remove(observer);
	}

	// 通知所有观察者
	@Override
	public void notify(String message) {
		// 会一直阻塞，直到所有观察者代码都执行完成
		observerList.forEach(item -> item.update(message));
	}

	// 通过注入的 IOC 容器获取到所有观察者对象 并添加至被观察者通知容器中
	@Override
	public void afterPropertiesSet() throws Exception {
		Map<String, IObserver> beansOfType = applicationContext.getBeansOfType(IObserver.class);
		beansOfType.forEach((k, v) -> this.register(v));
	}

}
